//https://blog.csdn.net/weixin_46528376/article/details/112686485?spm=1001.2014.3001.5501
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define INSERT_BEHIND		//定义了这行就用尾插擦，注释这行就用头插法

typedef struct node_s		//定义链表结构
{
	int	 	data;				//链表的数据域	
	struct node_s  *next;		//链表的指针域	
	
} node_t;						//重定义结构体node_s为node_t

int main (int argc, char **argv)
{
	node_t		*head = NULL;		//初始化链表的头指向nowhere
	node_t		*new_node;			//新结点的指针
	node_t		*tail;				//链表的尾指针
	node_t		*front;				//链表的头指针	

	int 		MagnetoF;		// 计数器（author of this passage: MagnetoF）
	
	
#ifdef	INSERT_BEHIND		//条件编译：定义了INSTER_BEHIND就使用尾插法实现队列的数据结构
	for( MagnetoF = 0; MagnetoF < 8; MagnetoF++)		//循环创建链表
	{
		new_node = malloc(sizeof(node_t) );		//创建一块内存，并用new_node指针标记
	
		memset(new_node, 0, sizeof(*new_node) );	//清空申请的内存

		new_node->next = NULL;				//新链表的尾部指向nowhere
		
		new_node->data = MagnetoF+1;			//把数据域放入相应的值

		if(head == NULL)
		{	
			head = new_node;			//若头指针为空，则是第一个结点，头指针指向新结点
		}
		else
		{	
			tail->next = new_node;		//非首个结点，尾结点的指针域指向新结点
		}
		tail =  new_node;			//尾指针指向新的结点

	}
#else 		//未定义INSERT_BEHIND时，使用头插法
	for( MagnetoF = 0; MagnetoF < 8; MagnetoF++)		//这里创建新链表的for循环和尾插法一样
	{
		new_node = malloc(sizeof(node_t) );		
	
		memset(new_node, 0, sizeof(*new_node) );	

		new_node->next = NULL;				
		
		new_node->data = MagnetoF+1;
	
	
		if(head == NULL)		//这里开始是头插法的关键
		{
			head = new_node;
		}
		else
		{
			front = head;			//用front保留住上一个链表的地址
			new_node->next = front;		//新链表的尾部指向上一个链表的头
			head = new_node;		//head指向新建链表的头
		}

	}
#endif
		node_t		*prt;		

		for(prt = head; prt != NULL; prt = prt->next)	//循环实现遍历
			printf("%d\n", prt->data);
		
	
	
	return 0;
	

}

